﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace MagicFight
{
    public class Reflect : Magic
    {
        int duration = Def.ReflectDef.Duration;
        int pointGain = Def.ReflectDef.PointGain;
        int range = Def.ReflectDef.Range;
        BlockAura blockAura = null;

        List<Projectile> projList = new List<Projectile>(); // esta lista serve para armazenar os projéteis q já foram refletidos (para não refletir mais de uma vez, e travar o prójetil pela duração do reflect)

        public Reflect(Character caster)
            : base(caster, Def.ReflectDef.N) { }

        public override void Effect(GameTime gameTime)
        {
            if (lifeTime == 0)
            {
                blockAura = new BlockAura(caster);
                blockAura.timer = duration;
                ps.effectsManager.Add(blockAura);
                foreach (Magic m in ps.magics)
                    if (m is HolyPower && m != this && m.caster == this.caster) m.alive = false;
            }
            
            foreach (GameObject go in ps.gameObjects)
                if (go is Projectile && Vector2.Distance(caster.position, go.position) < range)
                {
                    Projectile proj = (go as Projectile);
                    if (projList.Contains(proj)) continue;
                    projList.Add(proj); // 
                    
                    //proj.direction *= -1; // este era o método antigo: só invertia a direção
                    proj.direction = (proj.position - caster.position); // reflete o porjétil como se tivesse um circulo em volta do caster
                    proj.direction.Normalize();
                    
                    proj.canCollideWithCaster = true;
                    caster.AddPoints(type, pointGain);
                    pointGain = 0; // zera o pointGain para que não ganhe mais caso bloqueie outro projectile
                }

            if (lifeTime > duration) alive = false;
        }
    }
}
